Day 16 문자열, 수학, 배열, 조건문
Day16 16단계 20231104
- 20231103 웹개발-자바 수업에서 람다식을 배운 내용을 복습하기 위해 스트림을 사용해서 풀려는 시도는 했으나 아직 익숙치 않아서 스트림 적용이 어려웠다.
1. 편지
class Solution {
public int solution(String message) {
return 2*message.length();
}
}
2. 가장 큰 수 찾기
- 내 풀이 : 최대값은
stream(array).max().getAsInt()으로, 인덱스는filter().findFirst().getAsInt()를 사용했다.
import java.util.Arrays;
import java.util.stream.IntStream;
class Solution {
public int[] solution(int[] array) {
int[] answer = new int[2];
answer[0] = Arrays.stream(array).max().getAsInt();
answer[1] = IntStream.rangeClosed(1, array.length)
.filter(i -> array[i]==answer[0])
.findFirst()
.getAsInt();
return answer;
}
}
- 스트림을 안썼다면 최대값은 모든 요소를 돌면서
Math.max()로 최대값을, 인덱스는 for문을 돌리는 인덱스로 구했을 것 같다.
class Solution {
public int[] solution(int[] array) {
int[] answer = new int[2];
for(int i = 0; i < array.length; i++) {
answer[1] = ( Math.max(array[i], answer[0]) == array[i] ) ? i : answer[1];
answer[0] = Math.max(array[i], answer[0]);
}
return answer;
}
}
- 다른 사람 풀이 : array를 List로 변환한 후, 최대값은
maxcomparTo).orElse(0)을, 인덱스는list.indexOf(max를 사용했다.
List<Integer> list = Arrays.stream(array).boxed().collect(Collectors.toList());
int max = list.streamcompareTo).orElse(0;
int index = list.indexOf(max);
return new int[] {max, index};
3. 문자열 계산하기
- 내 풀이 : my_string을 공백을 기준으로 split(" ") 시켜 배열화한 다음, 배열의 요소가 특정 연산자일 때 연산을 진행했다.
class Solution {
public int solution(String my_string) {
String[] str = my_string.split(" ");
int answer = Integer.parseInt(str[0]);
for(int i = 1; i < str.length - 1; i+=2) {
if (str[i].equals("+")) {
answer += Integer.parseInt(str[i+1]);
} else if (str[i].equals("-")) {
answer -= Integer.parseInt(str[i+1]);
}
}
return answer;
}
}
- 다른 사람 풀이 : 연산자들을 공백으로 만들어 숫자 요소들만 합산을 한다. 먼저 "-" 연산자라면 "4 - 3" 형태를 "4 -3"으로 "-" 연산자 뒤의 공백을 제거하여 4와 -3으로 만들고, "+" 연산자는 my_string.replaceAll("[+]", "")을 사용하여 공백으로 만든 뒤 모든 요소를 더한다.
- String.trim()은 문자열의 앞 뒤 공백을 제거한다.
Arrays.stream(my_string.replaceAll("- ", "-").replaceAll("[+] ", "").trim().split(" "))
.mapToIntparseInt
.sum();
4. 배열의 유사도
- 내 풀이 : ArrayList를 사용해 contains()로 두 배열간의 중복 요소를 체크했다.
import java.util.*;
import java.util.stream.Collectors;
class Solution {
public int solution(String[] s1, String[] s2) {
int answer = 0;
List<String> list = Arrays.stream(s1).collect(Collectors.toList());
for(String str : s2) {
if (list.contains(str)) {
answer++;
}
}
return answer;
}
}
- 다른 사람 풀이 1 : stream에서 s1의 인덱스 요소들 중 s2와 중복되는 수만 카운트하도록 만들었다.
Stream<Boolean> stream = Arrays.stream(s1).map(s -> Arrays.asList(s2).contains(s)).filter(b -> b);
int answer = (int) stream.count();
return answer;
- 여기서 filter(b->b)를 넣지 않으면 false도 포함되므로 제거용으로 사용된다.
// filter()가 없는 경우
Stream<Boolean> stream = Arrays.stream(s1).map(s -> Arrays.asList(s2).contains(s));
stream.forEachprintln;
false
true
true
// filter()가 있는 경우
Stream<Boolean> stream = Arrays.stream(s1).map(s -> Arrays.asList(s2).contains(s)).filter(b->b);
stream.forEachprintln;
true
true